package com.example.myapplication.util;

import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;

import com.example.myapplication.bean.ImageDetailsBean;
import com.example.myapplication.database.table.ImageDatabase;
import com.google.gson.Gson;
//    使用AsyncTask获取网络数据
//    1.写一个类，继承与AsycnTask,传入三个参数：
//    1.执行异步任务时，传入的数据的类型，2.表示下载进度的类型  3。在后台执行完耗时操作，返回主线程的数据类型

public class LoadNetDataAsyncTask extends AsyncTask<String, Void, String> {
    ProgressDialog dialog;
    ImageDatabase database;
    SQLiteDatabase db;
    onGetNetDataListener listener;
    //    是否显示进度对话框的标志
    boolean isShow = false;
    // 将读取到的数据保存到文件当中
    boolean isSaveFile = false;
    //是否存入到数据库
    boolean isSaveDB = false;
    Context context;

    public LoadNetDataAsyncTask(Context context, onGetNetDataListener listener) {
        this.context = context;
        this.listener = listener;
        initDialog(context);
    }

    private void initDialog(Context context) {
        dialog = new ProgressDialog(context);
        dialog.setTitle("提示信息");
        dialog.setMessage("正在加载中......");
    }

    public LoadNetDataAsyncTask(Context context, onGetNetDataListener listener, boolean isShow, boolean isSaveFile, boolean isSaveDB) {
        this.context = context;
        this.listener = listener;
        this.isShow = isShow;
        this.isSaveFile = isSaveFile;
        this.isSaveDB = isSaveDB;
        initDialog(context);
    }

    //    2.重写三个方法
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

//       执行异步请求之前，会调用的函数，通常做初始化操作。在主线程中工作的方法
        if (isShow) {
            dialog.show();
        }

    }

    @Override
    protected String doInBackground(String... params) {
        //开启了子线程，进行耗时操作，将获取到的数据，返回给主线程
        String json = HttpUtils.getJsonByNetwork(params[0]);
        if (isSaveFile) {
            if (TextUtils.isEmpty(json)) {
                //数据为空了，需要读取内部存储当中的数据
                json = SaveDataUtils.readDataFromInternal(context, params[1]);//params[1]文件名
            } else {
                // 获取到网络数据了，将新得到的数据写入到内部存储当中，更新数据
                SaveDataUtils.writeDataToInternal(context, params[1], json);
            }
        }
//判断是否进行数据库存储
        if (isSaveDB) {
            //判断存储的文件名
            if (params[1].toString().equals(ContentUtils.FILE_IMAGE)) {
                database = new ImageDatabase(context, "imagetb.db", null, 1);
                db = database.getWritableDatabase();
                //进行解析
                Gson gson = new Gson();
                ImageDetailsBean bean = gson.fromJson(json, ImageDetailsBean.class);
                //进行数据库查询
                Cursor cursor = db.query("imagetb", null, null, null, null, null, null);
                while (cursor.moveToNext()) {
                    String title = cursor.getString(cursor.getColumnIndex("title"));
//如果标题有一样的，就说明数据库存放了该信息。就不需要再存储，直接跳出该方法

                    if (title.equals(bean.getTitle())) {
                        return json;
                    }

                }
                ContentValues values = new ContentValues();
                values.put("pic", ContentUtils.PICTURE_DISPLAY_URL + bean.getImage1());
                values.put("title", bean.getTitle());
                values.put("painter", bean.getAuthorbrief());
                values.put("summary", bean.getText1());
                values.put("author", bean.getText2());
                db.insert("imagetb", null, values);
                values.clear();
                return json;
            }

        }


        return json;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (isShow) {
            dialog.dismiss();
        }
//                回到了主线程，将子线程传回来的数据，进行操作，更新UI
//                判断如果子线程返回的数据，不为空，就显示在UI控件上
        if (!TextUtils.isEmpty(s)) {
//              解析数据
            listener.showDataFromNet(s);

        }
    }

    //定义一个接口，当获取到数据时，就调用接口当中的方法
    public interface onGetNetDataListener {
        public void showDataFromNet(String s);
    }
}
